#pragma warning disable 108
using System;
using System.Runtime.InteropServices;
using System.Collections.Generic;
using Cephei;
using Cephei.Generic;
using Cephei.QL.Times;
using Cephei.QL.Indexes;
using Cephei.QL.Termstructures;
using Cephei.QL.Math;
using Cephei.QL.Termstructures.Inflation;
namespace Cephei.QL.Experimental.Inflation
{
     // <summary> 
	// ! Since this can create a yoy term structure it does take a YoY index.  \todo deal with index interpolation.
	// </summary>
    [Guid ("414F9815-F951-4f61-A275-99477704CE03"),ComVisible(true)]
	public interface IYoYCapFloorTermPriceSurface : Cephei.QL.Termstructures.IInflationTermStructure
	{
		///////////////////////////////////////////////////////////////
        // Methods
        //
        
		 Double AtmYoYRate(Cephei.QL.Times.IPeriod d, Microsoft.FSharp.Core.FSharpOption<Cephei.QL.Times.IPeriod> obsLag, Microsoft.FSharp.Core.FSharpOption<Boolean> extrapolate);
        
		 Double AtmYoYRate(DateTime d, Microsoft.FSharp.Core.FSharpOption<Cephei.QL.Times.IPeriod> obsLag, Microsoft.FSharp.Core.FSharpOption<Boolean> extrapolate);
        
		 Double AtmYoYSwapRate(Cephei.QL.Times.IPeriod d, Microsoft.FSharp.Core.FSharpOption<Boolean> extrapolate);
        
		 Double AtmYoYSwapRate(DateTime d, Microsoft.FSharp.Core.FSharpOption<Boolean> extrapolate);
        
		 QL.Times.BusinessDayConventionEnum BusinessDayConvention {get;}
        
		 Double CapPrice(Cephei.QL.Times.IPeriod d, Double k);
        
		 Double CapPrice(DateTime d, Double k);
        
		 Cephei.IVector<Double> CapStrikes {get;}
        
		 UInt32 FixingDays {get;}
        
		 Double FloorPrice(Cephei.QL.Times.IPeriod d, Double k);
        
		 Double FloorPrice(DateTime d, Double k);
        
		 Cephei.IVector<Double> FloorStrikes {get;}
        
		 Cephei.IVector<Cephei.QL.Times.IPeriod> Maturities {get;}
        
		 DateTime MaxMaturity {get;}
        
		 Double MaxStrike {get;}
        
		 DateTime MinMaturity {get;}
        
		 Double MinStrike {get;}
        
		 Double Price(Cephei.QL.Times.IPeriod d, Double k);
        
		 Double Price(DateTime d, Double k);
        
		 Cephei.IVector<Double> Strikes {get;}
        
		 Cephei.QL.Indexes.IYoYInflationIndex YoyIndex {get;}
        
		 DateTime YoyOptionDateFromTenor(Cephei.QL.Times.IPeriod p);
        
		 Cephei.QL.Termstructures.IYoYInflationTermStructure YoYTS {get;}
    }

    // <summary> 
	// ! Since this can create a yoy term structure it does take a YoY index.  \todo deal with index interpolation. Factory
	// </summary>
   	[ComVisible(true)]
    public interface IYoYCapFloorTermPriceSurface_Factory // : Collection_Factory<IYoYCapFloorTermPriceSurface, ICell<IYoYCapFloorTermPriceSurface>>
    {
        ///////////////////////////////////////////////////////////////
        // Factory methods
        //
    }
}

